/* * Created on Mar 14, 2006 * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of * the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the * License for the specific language governing permissions and limitations under * the License. * * Copyright @2007 the original author or authors. */ package org.springmodules.cache.config; import junit.framework.TestCase; import org.easymock.classextension.MockClassControl; import org.springframework.beans.factory.config.BeanDefinition; import org.springframework.beans.factory.config.BeanDefinitionHolder; import org.springframework.beans.factory.config.RuntimeBeanReference; import org.springframework.beans.factory.support.BeanDefinitionRegistry; import org.springframework.beans.factory.support.RootBeanDefinition; import org.springframework.beans.factory.xml.BeanDefinitionParserDelegate; import org.springframework.beans.factory.xml.ParserContext; import org.springframework.beans.factory.xml.XmlReaderContext; import org.springframework.util.StringUtils; import org.springmodules.AssertExt; import org.w3c.dom.Element; import java.lang.reflect.Method; /** * Unit Tests for <code>{@link BeanReferenceParserImpl}</code>. * * @author Omar Irbouh * @author Alex Ruiz */ public class BeanReferenceParserImplTests extends TestCase { protected class BeanElementBuilder implements XmlElementBuilder { String beanName = ""; public Element toXml() { Element element = new DomElementStub("bean"); if (StringUtils.hasText(beanName)) { element.setAttribute("id", beanName); } return element; } } protected class ReferenceElementBuilder implements XmlElementBuilder { String refId = ""; public Element toXml() { Element element = new DomElementStub("reference"); if (StringUtils.hasText(refId)) { element.setAttribute("refId", refId); } return element; } } protected BeanDefinitionParserDelegate delegate; protected MockClassControl helperControl; private ReferenceElementBuilder elementBuilder; private BeanReferenceParserImpl parser; private ParserContext parserContext; private BeanDefinitionRegistry registry; /** * Constructor. * * @param name * the name of the test case */ public BeanReferenceParserImplTests(String name) { super(name); } public void testParseWithAnonymousBean() { String beanName = ""; Element beanElement = createBeanElementBuilder(beanName).toXml(); Element referenceElement = elementBuilder.toXml(); referenceElement.appendChild(beanElement); RootBeanDefinition beanDefinition = new RootBeanDefinition(String.class); BeanDefinitionHolder holder = new BeanDefinitionHolder(beanDefinition, beanName); delegate.parseBeanDefinitionElement(beanElement, null); helperControl.setReturnValue(holder); helperControl.replay(); // method to test Object actual = parser.parse(referenceElement, parserContext, true); assertSame(holder, actual); // assert the bean definition was not registered. assertEquals(0, registry.getBeanDefinitionCount()); } public void testParseWithEmptyRefIdAndWithoutInnerBean() { helperControl.replay(); // method to test try { parser.parse(elementBuilder.toXml(), parserContext, true); fail(); } catch (IllegalStateException exception) { // expecting exception. } } public void testParseWithNamedBeanNotToBeRegistered() { String beanName = "myBean"; Element beanElement = createBeanElementBuilder(beanName).toXml(); Element referenceElement = elementBuilder.toXml(); referenceElement.appendChild(beanElement); RootBeanDefinition beanDefinition = new RootBeanDefinition(String.class); BeanDefinitionHolder holder = new BeanDefinitionHolder(beanDefinition, beanName); delegate.parseBeanDefinitionElement(beanElement, null); helperControl.setReturnValue(holder); helperControl.replay(); // method to test Object actual = parser.parse(referenceElement, parserContext, false); assertSame(holder, actual); // assert the bean definition was not registered. assertEquals(0, registry.getBeanDefinitionCount()); } public void testParseWithNamedInnerBeanToBeRegistered() { String beanName = "myBean"; Element beanElement = createBeanElementBuilder(beanName).toXml(); Element referenceElement = elementBuilder.toXml(); referenceElement.appendChild(beanElement); RootBeanDefinition beanDefinition = new RootBeanDefinition(String.class); BeanDefinitionHolder holder = new BeanDefinitionHolder(beanDefinition, beanName); delegate.parseBeanDefinitionElement(beanElement, null); helperControl.setReturnValue(holder); helperControl.replay(); // method to test Object actual = parser.parse(referenceElement, parserContext, true); assertIsRuntimeBeanReference(actual, beanName); // assert the bean definition was registered. assertSame(beanDefinition, registry.getBeanDefinition(beanName)); } public void testParseWithNotEmptyRefId() { elementBuilder.refId = "myBean"; helperControl.replay(); // method to test Object actual = parser.parse(elementBuilder.toXml(), parserContext); assertIsRuntimeBeanReference(actual, elementBuilder.refId); } protected void setUp() throws Exception { setUpHelper(); elementBuilder = new ReferenceElementBuilder(); parser = new BeanReferenceParserImpl(); parserContext = ParserContextFactory.create(delegate); registry = parserContext.getRegistry(); } protected void tearDown() { helperControl.verify(); } private void assertIsRuntimeBeanReference(Object actual, String refId) { AssertExt.assertInstanceOf(RuntimeBeanReference.class, actual); RuntimeBeanReference actualReference = (RuntimeBeanReference) actual; assertEquals("<ref id>", refId, actualReference.getBeanName()); } private BeanElementBuilder createBeanElementBuilder(String beanName) { BeanElementBuilder beanElementBuilder = new BeanElementBuilder(); beanElementBuilder.beanName = beanName; return beanElementBuilder; } private void setUpHelper() throws NoSuchMethodException { Class targetClass = BeanDefinitionParserDelegate.class; Method parseBeanDefinitionElementMethod = targetClass.getDeclaredMethod( "parseBeanDefinitionElement", new Class[] { Element.class, BeanDefinition.class }); Method[] methodsToMock = { parseBeanDefinitionElementMethod }; helperControl = MockClassControl.createControl(targetClass, new Class[] { XmlReaderContext.class }, new Object[] { new XmlReaderContext(null, null, null, null, null, null) }, methodsToMock); delegate = (BeanDefinitionParserDelegate) helperControl.getMock(); } }